package com.example.utility.crypto.mac;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @author 季舟
 * @Date 2025-01-02 15:41
 */
public class HMACSHA256Demo {

    /**
     * 使用HMAC-SHA256算法生成哈希值
     * @param data 要进行哈希计算的数据
     * @param key 用于生成哈希的密钥
     * @return HMAC-SHA256哈希值的Base64编码字符串
     */
    public static String generateHMACSHA256(String data, String key) {
        try {
            // 创建一个SecretKeySpec对象，使用指定的密钥和算法
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            // 获取Mac实例，并初始化
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(secretKeySpec);
            // 计算哈希值
            byte[] hmacBytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
            // 将哈希值转换为Base64编码的字符串
            return Base64.getEncoder().encodeToString(hmacBytes);
        } catch (Exception e) {
            throw new RuntimeException("生成HMAC-SHA256失败", e);
        }
    }

    /**
     * 主程序入口
     * 演示如何使用generateHMACSHA256函数生成HMAC-SHA256哈希值
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 示例输入数据和密钥
        String data = "Hello, HMAC-SHA256!";
        String key = "secretKey";

        // 生成HMAC-SHA256哈希值
        String hmacSHA256 = generateHMACSHA256(data, key);
        System.out.println("输入数据: " + data);
        System.out.println("密钥: " + key);
        System.out.println("HMAC-SHA256哈希值: " + hmacSHA256);
    }
}

